home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / rbbs_pc / 17basm.zip / RBBSUTIL.ASM < prev    next >
Assembly Source File  |  1987-02-04  |  19KB  |  304 lines

  1. PAGE 66,132
  2. TITLE RBBS-PC Assembly Language Subroutines Copyright 1986, by D. Thomas Mack
  3. ;--------------------------------------------------------------------;
  4. ;ROUTINE: RBBSFIND            AUTHOR:  D. Thomas Mack                ;
  5. ;                                      10210 Oxfordshire Road        ;
  6. ;                                      Great Falls, Virginia  22066  ;
  7. ;                                                                    ;
  8. ;DATE:  June 29, 1986         VERSION: 1.0                           ;       
  9. ;                                                                    ;
  10. ;FUNCTION: This routine supports calls from the IBM (MICROSOFT)      ;
  11. ;          BASIC Version 2.0 or Microsoft Quick BASIC Version 1.0    ;
  12. ;          compilers to find the date a file was created.            ;
  13. ;                                                                    ;
  14. ;            CALL RBBSFIND (A$,ERROR%,YEAR%,MONTH%,DAY%)             ;
  15. ;                                                                    ;
  16. ;          where A$ is the fully qualified file name to find the     ;
  17. ;                   date for and all other parameters are zeroes.    ;
  18. ;                                                                    ;
  19. ; Offset   Variable    Description of Variable                       ;
  20. ;                                                                    ;
  21. ; BP+14       BX  = string descriptor address of the file name to    ;
  22. ;                   find the creation date for where the string      ;
  23. ;                   descriptior has the format:                      ;
  24. ;                                                                    ;
  25. ;                   Bytes 0 and 1 contain the length of the string   ;
  26. ;                                 (0 to 32,767).                     ;
  27. ;                   Bytes 2 and 3 contain the lower and upper 8 bits ;
  28. ;                                 of the string's starting address   ;
  29. ;                                 in string space (respectively).    ;
  30. ; BP+12   ERROR% = Zero if no error was encountered.  Non-zero if an ;
  31. ;                  error occurred.                                   ;
  32. ; BP+10    YEAR% = number of years since 1980 when file was last     ;
  33. ;                  modified.
  34. ; BP+8    MONTH% = month the file was last modified.                 ;
  35. ; BP+6      DAY% = day the file was last modified.                   ;
  36. ;                                                                    ;
  37. ;--------------------------------------------------------------------;
  38. ;
  39. ; LIST OF PARAMETERS AS THEY APPEAR ON THE STACK
  40. ;
  41. PARMLIST STRUC
  42. SAVE_BP   DW     ?             ;RETAINS CONTENTS OF BASE POINTER REGISTER
  43. RET_OFF   DW     ?             ;RETURN ADDRESS OF CALLING PROGRAM
  44. RET_SEG   DW     ?             
  45. PARM5     DW     ?             ;DAY FILE WAS CREATED
  46. PARM4     DW     ?             ;MONTH FILE WAS CREATED
  47. PARM3     DW     ?             ;YEAR FILE WAS CREATED (PAST 1980)
  48. PARM2     DW     ?             ;ERROR RETURN CODE
  49. PARM1     DW     ?             ;STRING DESCRIPTOR
  50. PARMLIST  ENDS
  51. ;
  52. ; LET THE ASSEMBLER CALCULATE THE VALUE FOR RETURNING FROM SUBROUTINE WITH EQU
  53. ;
  54. PARMSIZE  EQU    OFFSET PARM1 - OFFSET RET_SEG
  55. ;
  56. ; LOCAL DATA AREA FOR INITIALIZED CONSTANTS (NONE)
  57. ;
  58. CONST     SEGMENT WORD PUBLIC 'CONST'
  59. CONST     ENDS
  60. ;
  61. ; LOCAL DATA AREA OF UNINITIALIZED VALUES
  62. DATA      SEGMENT WORD PUBLIC 'DATA'
  63. SAVE_DTA_OFF DW  ?             ;ADDRESS OF CURRENT DISK TRANSFER AREA
  64. SAVE_DTA_SEG DW  ?      
  65. RBBSDTA      DB 30 DUP(?)      ;WORKING DTA (NOT BASIC'S)
  66. PATHFILE     DB 64 DUP(?)      ;PATH AND FILE NAME FOR SEARCH
  67. DATA      ENDS
  68. DGROUP    GROUP DATA,CONST
  69. ;
  70. ; DEFINE A STACK TO PUSH UP TO 3 ITEMS ON THE STACK AT ANY GIVEN TIME
  71. ;
  72. STACK     SEGMENT WORD STACK 'STACK'
  73.           DW      4 DUP(?)
  74. STACK     ENDS
  75. RBBS_UTIL SEGMENT BYTE PUBLIC 'CODE'
  76.           ASSUME  CS:RBBS_UTIL,DS:DGROUP
  77. RBBSFIND  PROC   FAR           ;LONG CALL
  78.           PUBLIC RBBSFIND
  79.           PUSH   BP            ;SAVE CALLER'S BASE POINTER REGISTER -- BP 
  80.           MOV    BP,SP         ;SETUP TO ADDRESS OFF OF BASE POINTER REGISTER
  81.           MOV    BX,[BP].PARM1 ;GET FILE NAME STRING DESCRIPTOR ADDRESS
  82.           MOV    CX,[BX]       ;GET THE SIZE OF THE STRING
  83.           XOR    AX,AX         ;INDICATE NO ERROR CONDITIONS
  84.           CMP    CX,0          ;IF LENGTH IS ZERO,
  85.           JE     FINISH        ;EXIT
  86. ;
  87.           MOV    SI,[BX+2]     ;GET THE ADDRESS OF THE STRING
  88.           PUSH   DS            ;PUSH DATA SEGMENT REGISTER -- DS, 
  89.           POP    ES            ;INTO EXTENDED SEGMENT REGISTER -- ES, FOR MOVE
  90.           LEA    DI,PATHFILE   ;MOVE PATH/FILE SPECIFICATION TO "PATHFILE" AREA
  91.           CLD                  ;CLEAR DIRECTION FLAGS
  92.           REP    MOVSB         ;END STRING WITH A BINARY ZERO FOR DOS CALL
  93.           MOV    BYTE PTR ES:[DI],0
  94. ;
  95.           MOV    AH,2FH        ;GET DISK TRANSFER AREA ADDRESS IN BX
  96.           INT    21H           ;ISSUE DOS INTERRUPT 21
  97.           JC     FINISH        ;EXIT IF THERE WERE ERRORS
  98.           MOV    SAVE_DTA_OFF,BX ;SAVE BASIC'S DISK TRANSFER AREA
  99.           MOV    SAVE_DTA_SEG,ES
  100. ;
  101.           LEA    DX,RBBSDTA    ;SET UP PRIVATE DISK TRANSFER AREA FROM BASIC'S
  102.           MOV    AH,1AH        ;SETUP NEW TEMPORARY DISK TRANSFER AREA ADDRESS
  103.           INT    21H           ;ISSUE DOS INTERRUPT 21
  104.           JC     FINISH        ;EXIT IF THERE WERE ERRORS 
  105. ;
  106.           XOR    CX,CX         ;SET UP TO LOOK FOR ALL DIRECTORY ENTRIES
  107.           LEA    DX,PATHFILE   ;FIND THE FIRST FILE THAT MATCHES "PATHFILE"
  108.           MOV    AH,4EH        ;CALL DOS FUNCTION X'4E' TO FIND FILE
  109.           INT    21H           ;ISSUE DOS INTERRUPT 21
  110.           JC     EXIT          ;EXIT IF THERE WHERE ERRORS
  111. ;
  112.           LEA    DI,RBBSDTA+24 ;POINT TO DATE FIELD IN DISK TRANSFER AREA (+24)
  113.           MOV    AX,DS:[DI]    ;GET DATE OF FILE (DTA +24) IN AX REGISTER
  114. ;                               BITS 0-4  = DAY(1-31)
  115. ;                               BITS 5-8  = MONTH(1-12)
  116. ;                               BITS 9-15 = YEAR(0 - 119, AS AN OFFSET OF 1980)
  117. ;      SET UP AS FOLLOWS:
  118. ;
  119. ;      |<-------YEAR------->|<--MONTH-->|<-----DAY---->|
  120. ;      |15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0|
  121. ;      |           |           |           |           | 
  122. ;        0  0  0  0  0  0  0  1  1  1  1  0  0  0  0  0  = X'01E0'  
  123. ;        0  0  0  0  0  0  0  0  0  0  0  1  1  1  1  1  = X'001F'
  124.  
  125.           MOV    BX,AX         ;GET THE DATE INTO THE BX REGISTER
  126.           MOV    CL,9          ;PREPARE TO SHIFT RIGHT NINE BITS (0-8)
  127.           SHR    BX,CL         ;SHIFT RIGHT NINE BITS LEAVING THE YEAR ONLY
  128.           MOV    DI,[BP].PARM3 ;GET ADDRESS OF WHERE TO PUT YEAR (AS AN INDEX 
  129.           MOV    [DI],BX       ;PAST 1980) FILE WAS CREATED AND PASS IT BACK
  130. ;
  131.           MOV    BX,AX         ;GET THE DATE INTO THE BX REGISTER AGAIN
  132.           AND    BX,01E0H      ;TURN OFF ALL THE BITS EXCEPT BITS 5-8 (MONTH)
  133.           MOV    CL,5          ;PREPARE TO SHIFT RIGHT FIVE BITS (0-4)
  134.           SHR    BX,CL         ;SHIFT RIGHT FIVE BITS TO GET MONTH ONLY
  135.           MOV    DI,[BP].PARM4 ;GET ADDRESS OF WHERE TO PUT MONTH FILE WAS MADE
  136.           MOV    [DI],BX       ;PASS BACK THE MONTH THE FILE WAS CREATED
  137. ;
  138.           AND    AX,001FH      ;TURN OFF ALL THE BITS EXCEPT BITS 0-4 (THE DAY)
  139.           MOV    DI,[BP].PARM5 ;GET ADDRESS OF WHERE TO PUT DAY FILE WAS MADE
  140.           MOV    [DI],AX       ;PASS BACK THE DAY THE FILE WAS CREATED
  141.           XOR    AX,AX         ;INDICATE NO ERROR CONDITIONS
  142.  
  143. ;
  144. EXIT:     PUSH   AX            ;SAVE ERROR INDICATOR REGISTER -- AX
  145.           PUSH   DS            ;SAVE DATA SEGMENT REGISTER -- DS
  146.           MOV    DX,SAVE_DTA_OFF ;RESTORE BASIC'S DISK TRANSFER AREA AFTER  CPC151A7+
  147.           MOV    DS,SAVE_DTA_SEG ;SETTING UP THE TEMPORARY RBBS-PC ONE      CPC151A7+
  148.           MOV    AH,1AH        ;CALL DOS FUNCTION '1A' TO CHANGE DTA'S
  149.           INT    21H          ;ISSUE DOS INTERRUPT 21                      CPC151A7+
  150.           POP    DS            ;RESTORE DATA SEGMENT REGISTER -- DS
  151.           POP    AX            ;RESTORE ERROR INDICATOR REGISTER -- AX
  152. ;
  153. FINISH:   MOV    DI,[BP].PARM2 ;GET ADDRESS OF WHERE TO PUT ERROR RETURN CODE
  154.           MOV    [DI],AX       ;PUT THE ERROR RETURN CODE IN ERROR%
  155.           POP    BP            ;RESTORE CALLERS BASE POINTER REGISTER-- BP
  156.           RET    PARMSIZE      ;RETURN AND REMOVE THE 5 PARAMETERS FROM STACK
  157. RBBSFIND  ENDP
  158. ;--------------------------------------------------------------------;
  159. ;ROUTINE: RBBSULC             AUTHOR:  D. Thomas Mack                ;
  160. ;                                      10210 Oxfordshire Road        ;
  161. ;                                      Great Falls, Virginia  22066  ;
  162. ;                                                                    ;
  163. ;DATE:  June 29, 1986         VERSION: 1.0                           ;       
  164. ;                                                                    ;
  165. ;FUNCTION: This routine supports calls from the IBM (MICROSOFT)      ;
  166. ;          BASIC Version 2.0 or Microsoft Quick BASIC Version 1.0    ;
  167. ;          compilers to convert a string to upper case alphabetic    ;
  168. ;          characters.                                               ;
  169. ;                                                                    ;
  170. ;            CALL RBBSULC (A$)                                       ;
  171. ;                                                                    ;
  172. ;          where A$ is the string to be converted to upper case.     ;
  173. ;                                                                    ;
  174. ; Offset   Variable    Description of Variable                       ;
  175. ;                                                                    ;
  176. ; BP+6        BX  = string descriptor address where the string       ;
  177. ;                   descriptor has the format:                       ;
  178. ;                                                                    ;
  179. ;                   Bytes 0 and 1 contain the length of the string   ;
  180. ;                                 (0 to 32,767).                     ;
  181. ;                   Bytes 2 and 3 contain the lower and upper 8 bits ;
  182. ;                                 of the string's starting address   ;
  183. ;                                 in string space (respectively).    ;
  184. ;                                                                    ;
  185. ;--------------------------------------------------------------------;
  186. RBBSULC   PROC   FAR           ;LONG CALL
  187.           PUBLIC RBBSULC
  188.           PUSH   BP            ;SAVE CALLERS BASE POINTER REGISTER -- BP 
  189.           MOV    BP,SP         ;SETUP TO ADDRESS OFF OF BASE POINTER REGISTER
  190.           MOV    BX,[BP+6]     ;GET A$ STRING DESCRIPTOR ADDRESS
  191.           MOV    CX,[BX]       ;GET LENGTH OF STRING A$ IN CX REGISTER
  192.           MOV    DI,2[BX]      ;GET ADDRESS OF STRING A$ IN DATA INDEX 
  193.           CMP    CX,0          ;IF LENGTH IS ZERO (I.E. PASSED A NULL STRING)
  194.           JZ     DONE          ;EXIT
  195. LOOP:     MOV    AL,[DI]       ;GET A CHARACTER.
  196.           CMP    AL,'a'        ;IF LESS THAN A LOWER CASE "A" DON'T CHANGE. 
  197.           JL     NEXT          ;JUMP TO GET THE NEXT CHARACTER.    
  198.           CMP    AL,'z'        ;IF GREATER THAN A LOWER CASE "Z" DON'T CHANGE.
  199.           JA     NEXT          ;JUMP TO GET THE NEXT CHARACTER.
  200. LOWER:    SUB    AL,32         ;SUBTRACT 32 FROM VALUE IF A LOWER CASE LETTER.
  201.           MOV    [DI],AL       ;STORE THE VALUE IN THE STRING AREA.
  202. NEXT:     INC    DI            ;POINT TO THE NEXT CHARACTER OF THE STRING.
  203.           LOOP   LOOP          ;NOW GO BACK TO TEST THE NEXT CHARACTER.
  204. DONE:     POP    BP            ;RESTORE CALLERS BASE POINTER REGISTER-- BP
  205.           RET    2             ;RETURN AND REMOVE THE 1 PARAMETES FROM STACK
  206. RBBSULC   ENDP
  207. ;--------------------------------------------------------------------;
  208. ;ROUTINE: RBBSFREE            AUTHOR:  D. Thomas Mack                ;
  209. ;                                      10210 Oxfordshire Road        ;
  210. ;                                      Great Falls, Virginia  22066  ;
  211. ;                                                                    ;
  212. ;DATE:  June 29, 1986         VERSION: 1.0                           ;       
  213. ;                                                                    ;
  214. ;FUNCTION: This routine supports calls from the IBM (MICROSOFT)      ;
  215. ;          BASIC Version 2.0 or Microsoft Quick BASIC Version 1.0    ;
  216. ;          compilers to DOS interrupt 36 to find the amount of free  ;
  217. ;          space on a specific disk drive.                           ;
  218. ;                                                                    ;
  219. ;            CALL RBBSFREE (AX%,BX%,CX%,DX%)                         ;
  220. ;                                                                    ;
  221. ;          where AX% and BX% are 16-bit binary data items (i.e.      ;
  222. ;          integer variables) and should be as follows:              ;
  223. ;                                                                    ;
  224. ; Offset   Variable    Description of Variable                       ;
  225. ;                                                                    ;
  226. ; BP+12       AX% = number of the disk drive to find the free space  ;
  227. ;                   for where 0=default drive, 1=A, 2=B, etc.        ;
  228. ;                                                                    ;
  229. ; BP+10       BX% = zero when calling RBBSFREE                       ;
  230. ; BP+8        CX% = zero when calling RBBSFREE                       ;
  231. ; BP+6        DX% = zero when calling RBBSFREE                       ;
  232. ;                                                                    ;
  233. ;          upon returning from RBBSFREE, these are set as follows:   ;
  234. ;                                                                    ;
  235. ;             AX% = if the drive specified was invalid contains the  ;
  236. ;                   hexadecimal value of FFFF.  If the drive was     ;
  237. ;                   valid contains the number of sectors per cluster.;
  238. ;             BX% = contains the number of available clusters.       ;
  239. ;             CX% = contains the number of bytes per sector.         ;
  240. ;             DX% = contains the total number of clusters on the     ;
  241. ;                   drive.                                           ;
  242. ;           FREESPACE = AX%*BX%*CX% IF AX%<> X'FFFF'                 ;
  243. ;--------------------------------------------------------------------;
  244. RBBSFREE  PROC   FAR           ;LONG CALL
  245.           PUBLIC RBBSFREE
  246.           PUSH   BP            ;SAVE CALLERS BASE POINTER REGISTER -- BP 
  247.           MOV    BP,SP         ;SETUP TO ADDRESS OFF OF BASE POINTER REGISTER
  248.           MOV    DI,[BP+12]    ;GET ADDRESS OF AX% PARAMETER
  249.           MOV    DL,[DI]       ;PUT VALUE IN DL REGISTER OF DISK DRIVE
  250.           MOV    AH,36H        ;CALL DOS FUNCTION 36 TO GET FREE DISK SPACE
  251.           INT    21H           ;ISSUE DOS INTERRUPT 21 
  252.           MOV    DI,[BP+12]    ;GET ADDRESS OF AX% PARAMETER
  253.           MOV    [DI],AX       ;PUT VALUE OF AX IN AX% PARAMETER
  254.           MOV    DI,[BP+10]    ;GET ADDRESS OF BX% PARAMETER
  255.           MOV    [DI],BX       ;PUT VALUE OF BX IN BX% PARAMETER
  256.           MOV    DI,[BP+8]     ;GET ADDRESS OF CX% PARAMETER
  257.           MOV    [DI],CX       ;PUT VALUE OF CX IN CX% PARAMETER
  258.           MOV    DI,[BP+6]     ;GET ADDRESS OF DX% PARAMETER
  259.           MOV    [DI],DX       ;PUT VALUE OF DX IN DX% PARAMETER
  260.           POP    BP            ;RESTORE CALLERS BASE POINTER REGISTER-- BP
  261.           RET    8             ;RETURN AND REMOVE THE 4 PARAMETERS FROM STACK
  262. RBBSFREE  ENDP
  263. ;--------------------------------------------------------------------;
  264. ;ROUTINE: RBBSDOS             AUTHOR:  D. Thomas Mack                ;
  265. ;                                      10210 Oxfordshire Road        ;
  266. ;                                      Great Falls, Virginia  22066  ;
  267. ;                                                                    ;
  268. ;DATE:  June 29, 1986         VERSION: 1.0                           ;       
  269. ;                                                                    ;
  270. ;FUNCTION: This routine supports calls from the IBM (MICROSOFT)      ;
  271. ;          BASIC Version 2.0 or Microsoft Quick BASIC Version 1.0    ;
  272. ;          compilers to DOS interrupt 33 to find the version of DOS  ;
  273. ;          that RBBS-PC is being run under.                          ;
  274. ;                                                                    ;
  275. ;            CALL RBBSDOS (AX%,BX%)                                  ;
  276. ;                                                                    ;
  277. ;          where AX% and BX% are 16-bit binary data items (i.e.      ;
  278. ;          integer variables) and should be as follows:              ;
  279. ;                                                                    ;
  280. ; Offset   Variable    Description of Variable                       ;
  281. ;                                                                    ;
  282. ; BP+8        AX% = major version number of the DOS that RBBS-PC is  ;
  283. ;                   running under.  (Zero if less than DOS 2.0)      ;
  284. ;                                                                    ;
  285. ; BP+6        BX% = minor version under of the DOS that RBBS-PC is   ;
  286. ;                   running under.                                   ;
  287. ;--------------------------------------------------------------------;
  288. RBBSDOS   PROC   FAR           ;LONG CALL
  289.           PUBLIC RBBSDOS
  290.           PUSH   BP            ;SAVE CALLERS BASE POINTER REGISTER -- BP 
  291.           MOV    BP,SP         ;SETUP TO ADDRESS OFF OF BASE POINTER REGISTER
  292.           MOV    AH,30H        ;CALL DOS FUNCTION 30 TO GET DOS VERSION
  293.           INT    21H           ;ISSUE DOS INTERRUPT 21 
  294.           MOV    DI,[BP+8]     ;GET ADDRESS OF AX% PARAMETER
  295.           MOV    [DI],AL       ;PUT VALUE OF MAJOR DOS NUMBER IN AX% PARAMETER
  296.           MOV    DI,[BP+6]     ;GET ADDRESS OF BX% PARAMETER
  297.           MOV    [DI],AH       ;PUT VALUE OF MINOR DOS VERSION IN B% PARAMETER
  298.           POP    BP            ;RESTORE CALLERS BASE POINTER REGISTER-- BP
  299.           RET    4             ;RETURN AND REMOVE THE 2 PARAMETERS FROM STACK
  300. RBBSDOS   ENDP
  301. RBBS_UTIL ENDS
  302.           END
  303.